# Прецедент настройки доступа к переводам состояний Требуется администрируемый объект «Договоры» таким образом, чтобы пользователю роли были доступны только расходные договоры определенных подразделений. - В справочнике администрируемых объектов (Приложение «Администратор», Настройки -> Администрируемые объекты) найти требуемый — Cnt_Contract и перейти в его карточку. - В карточке администрируемого объекта отметить признак «Дискретный доступ». На закладке «Дискретные ограничения доступа» создать административные правило с типом «Примитивное правило». ![](img/ondisc.png) - Для каждого правила вставить переданные разработчиками скрипты на закладках «Скрипт для фильтрации объектных привилегий» (отвечает за фильтрацию объектов в списках. В примере данного прецедента — скрывает из перечня договоры других типов и ОФС) и «Скрипт проверки строк по объектному кешу» (блокирует возможность открытия недоступных договоров по ссылке из прочих документов, например, запрещает пользователю открыть карточку недоступного договора из лота). ОФС участников договора: Скрипт для фильтрации объектных привилегий ```sql select 1 from cnt_Contract tt join Cnt_ContractOFSParticipants cp on tt.id = cp.idcontract join Bs_OFStructure ofs on cp.idofstructure = ofs.id where tt.id = (&id) and exists ( select 1 from (select cast(json_array_elements_text(cast((¶ms) as json)) as int8) as id) ids where ids.id = ofs.id ) ``` ОФС участников договора: Скрипт для проверки строк по объектному кешу ``` for (p: params) { var idv = row.id; var ropObj = Cnt_ContractApi.load(idv); var colRops = Cnt_ContractOFSParticipantsApi.byParent(ropObj); var colJRops = toJRops(colRops).asList(); for (colRop: colJRops) { if (colRop.idOFStructure != null) { if (colRop.idOFStructure.toString() == p.toString()) { return true; } } } } ``` Тип договора: Скрипт для фильтрации объектных привилегий ```sql select 1 from cnt_Contract tt join ( select cast(json_array_elements_text(cast((¶ms) as json)) as int8) as id ) as ids on tt.idobjecttype = ids.id where tt.id = (&id) ``` Тип договора: Скрипт для проверки строк по объектному кешу ``` for (p: params) { var idv = row.id; var ropObj = Cnt_ContractApi.load(idv); var idObjectType = Cnt_ContractApi.getAttrValue(ropObj,"idObjectType"); if (idObjectType.toString() == p.toString()) { return true; } } ``` - На закладке "Параметр правила" для каждого правила выбрать Тип параметра — "Ссылочный на объект" и выбрать класс, из которого будут выбираться значения. В данном случае — Bs_OFStructure (ОФС) и Btk_ObjectType (Тип объекта) ![](img/params.png) - В карточке роли перейти на закладку «Дискретный доступ» и добавить администрируемый объект, доступ к которому необходимо настроить. В детализации на закладке «Значения правила» указать значения, по которым будут проверяться правила. ![](img/addobjs.png) - На закладке «Права роли» найти и выделить администрируемый бизнес-объект. В детализации «Расшифровка прав» выбрать настроенное ограничение для прав на просмотр или редактирование объектов. ![](img/chooserules.png)